import Vue from 'vue'
import { login, getLoginUser, logout } from '@/api/modular/system/loginManage'
import { sysDictTypeTree } from '@/api/modular/system/dictManage'
import { sysMenuChange } from '@/api/modular/system/menuManage'
import { ACCESS_TOKEN, ALL_APPS_MENU, DICT_TYPE_TREE_DATA, COMPANY_NAME } from '@/store/mutation-types'

import { welcome } from '@/utils/util'
import store from '../index'
import router from '../../router'

const user = {
  state: {
    token: localStorage.getItem('access-token') || '',
    name: '',
    welcome: '',
    avatar: '',
    buttons: [], // 按钮权限
    admintype: '', // 是否是超管
    roles: [],
    info: {}
  },

  mutations: {
    SET_TOKEN: (state, token) => {
      state.token = token
      localStorage.setItem('access-token', token)
    },
    SET_NAME: (state, { name, welcome }) => {
      state.name = name
      state.welcome = welcome
    },
    SET_AVATAR: (state, avatar) => {
      state.avatar = avatar
    },
    SET_ROLES: (state, roles) => {
      state.roles = roles
    },
    SET_INFO: (state, info) => {
      state.info = info
    },
    SET_BUTTONS: (state, buttons) => {
      state.buttons = buttons
    },
    SET_ADMINTYPE: (state, admintype) => {
      state.admintype = admintype
    }
  },

  actions: {
    // 登录
    Login({ commit }, userInfo) {
      return new Promise((resolve, reject) => {
        login(userInfo)
          .then(response => {
            if (!response.success) {
              reject(response.message)
              return
            }
            const result = response.data
            Vue.ls.set(ACCESS_TOKEN, result, 7 * 24 * 60 * 60 * 1000)
            commit('SET_TOKEN', result)
            resolve()
            // eslint-disable-next-line handle-callback-err
          })
          .catch(error => {
            // eslint-disable-next-line prefer-promise-reject-errors
            reject('后端未启动或代理错误')
          })
      })
    },

    // 获取用户信息
    GetInfo({ commit }) {
      return new Promise((resolve, reject) => {
        getLoginUser()
          .then(response => {
            if (response.success) {
              const data = response.data
              commit('SET_ADMINTYPE', data.adminType)
              commit('SET_ROLES', 1)
              commit('SET_BUTTONS', data.permissions)
              commit('SET_INFO', data)
              commit('SET_NAME', { name: data.name, welcome: welcome() })
              Vue.ls.set(COMPANY_NAME, data.tenantName)
              if (data.avatar != null) {
                commit('SET_AVATAR', process.env.VUE_APP_API_BASE_URL + '/sysFileInfo/preview?id=' + data.avatar)
              }
              resolve(data)
            } else {
              // eslint-disable-next-line no-undef
              reject(new Error(data.message))
            }
          })
          .catch(error => {
            reject(error)
          })
      })
    },

    // 登出
    Logout({ commit, state }) {
      return new Promise(resolve => {
        logout(state.token)
          .then(() => {
            resolve()
          })
          .catch(() => {
            resolve()
          })
          .finally(() => {
            commit('SET_TOKEN', '')
            commit('SET_ROLES', [])
            commit('SET_BUTTONS', [])
            commit('SET_ADMINTYPE', '')
            Vue.ls.remove(ACCESS_TOKEN)
            Vue.ls.remove(ALL_APPS_MENU)
            Vue.ls.remove(DICT_TYPE_TREE_DATA)
          })
      })
    },

    // 加载所有字典数据
    dictTypeData() {
      return new Promise((resolve, reject) => {
        sysDictTypeTree()
          .then(data => {
            if (data.success) {
              const result = data.data
              Vue.ls.set(DICT_TYPE_TREE_DATA, result)
              resolve()
            } else {
              // eslint-disable-next-line no-undef
              reject(new Error(data.message))
            }
          })
          .catch(error => {
            reject(error)
          })
      })
    },

    // 切换应用菜单
    MenuChange({ commit }, application) {
      return new Promise(resolve => {
        sysMenuChange({ application: application.code })
          .then(res => {
            const apps = { code: '', name: '', active: '', menu: '' }
            apps.active = true
            apps.menu = res.data
            // eslint-disable-next-line camelcase
            const all_app_menu = Vue.ls.get(ALL_APPS_MENU)
            // eslint-disable-next-line camelcase
            const new_false_all_app_menu = []
            // 先去除所有默认的，以为此时切换的即将成为前端缓存默认的应用
            all_app_menu.forEach(item => {
              if (item.active) {
                item.active = false
              }
              new_false_all_app_menu.push(item)
            })
            // 此时缓存中全部都是不默认的应用
            Vue.ls.set(ALL_APPS_MENU, new_false_all_app_menu)
            apps.name = application.name
            apps.code = application.code
            const applocationR = []
            applocationR.push(apps)
            Vue.ls.set(ALL_APPS_MENU, applocationR)
            resolve(res)
            const antDesignmenus = res.data
            store.dispatch('GenerateRoutes', { antDesignmenus }).then(() => {
              router.addRoutes(store.getters.addRouters)
            })
            // 切换应用刷新整体界面，暂且取消
            // window.location.reload()
          })
          .catch(() => {
            resolve()
          })
      })
    }
  }
}

export default user
